﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using System.Diagnostics;
using Microsoft.Xna.Framework.Graphics;

namespace StarControl
{
    public class Escudo : God
    {
        private float vida;
        private Nave owner;
        private Texture2D imagem;
        public BoundingBox boxEscudo;
        private TimeSpan timeOut;
        public bool escudoAtivo;
        TipoEscudo.Tipo tipoEscudo;
        TipoEscudo.Habilidade habilidadeEscudo;
        private float angle;
        private Vector2 offset;

        private Vector2 direcao_;

        public Escudo(Game game, Nave owner, Vector2 posicao)
            : base(game)
        {
            this.owner = owner;
            setPosition(posicao);
            //chamada forçada de metodo!
            offset = new Vector2(0, 50);
            Initialize();
        }

        public Escudo(Game game, Nave owner, Vector2 posicao,
            TipoEscudo.Tipo tipoEscudo, TipoEscudo.Habilidade habilidadeEscudo)
            : base(game)
        {
            this.owner = owner;
            setPosition(posicao);
            this.tipoEscudo = tipoEscudo;
            this.habilidadeEscudo = habilidadeEscudo;
            //chamada forçada de metodo!
            offset = new Vector2(0, 50);
            Initialize();
        }

        public Texture2D getImagem()
        {
            return this.imagem;
        }

        public Nave getOwner()
        {
            return this.owner;
        }

        public void setImagem(Texture2D imagem)
        {
            this.imagem = imagem;
        }

        // Inicia as variaveis basicas
        public override void Initialize()
        {
            zerarEscudo();

        }

        private void zerarEscudo()
        {
            timeOut = new TimeSpan(0, 0, 5);
            escudoAtivo = false;
        }

        public bool ocorreuColisao()
        {
            return false;
        }

        public bool getSituacao()
        {
            return this.escudoAtivo;
        }

        public void ativarEscudo()
        {
            zerarEscudo();
            escudoAtivo = true;

            if (this.tipoEscudo.Equals(TipoEscudo.Tipo.Fisico))
            {
                setImagem(owner.getImagemEscudoBasico());
            }
            else{
                setImagem(owner.getImagemHidden());
            }

            //* Usado para flare - será sobrescrito caso seja invisivel *//
            setPosition(owner.getPosition());
            direcao_ = owner.getDirecao();
        }

        public override void Update(GameTime gameTime)
        {
            if (escudoAtivo)
            {
                // Se for um escudo padrão não deve ter timeout...
                if (!tipoEscudo.Equals(TipoEscudo.Tipo.Fisico))
                {
                    timeOut -= gameTime.ElapsedGameTime;
                    if (timeOut <= TimeSpan.Zero)
                    {
                        escudoAtivo = false;
                    }
                }

                // Tipo de escudo é uma habilidade
                if (tipoEscudo.Equals(TipoEscudo.Tipo.Habilidade))
                {
                    // Escudo é uma habilidade do tipo invisibilidade
                    if (habilidadeEscudo.Equals(TipoEscudo.Habilidade.Invisibilidade))
                    {
                        // Verifica se o escudo está ativo (no caso invisibilidade)
                        setPosition(owner.getPosition());
                    }
                    // Habilidade de defesa
                    else
                    {
                        setPosition(getPosition() + direcao_);
                       // Implementação customizada
                    }
                }
                // Tipo  Fisico (BASICO)
                else
                {
                    angle += (float)(MathHelper.ToRadians(270) * gameTime.ElapsedGameTime.TotalSeconds);
                }
            }// Fim do Escudo Ativo
        }

        public override void Draw(GameTime gameTime)
        {
            // Só mostra caso o escudo estiver ativo
            if (escudoAtivo)
            {
                if (!tipoEscudo.Equals(TipoEscudo.Tipo.Fisico))
                {
                    // Caso ele seja FLEAR
                    if (habilidadeEscudo.Equals(TipoEscudo.Habilidade.Defesa))
                    {
                        owner.getBatch().Begin();
                        Vector2 _direcao = owner.getDirecao();
                        owner.getBatch().Draw(imagem, getPosition(), //antes estava apenas getPosition()
                            new Rectangle(0, 0, imagem.Width, imagem.Height), Color.White,
                            (float)Math.Atan2(_direcao.Y, _direcao.X),
                            new Vector2(imagem.Width / 2, imagem.Height / 2), //antes estava apenas new Vector2(imagem.Width, imagem.Height / 2)
                            1.0f, SpriteEffects.None, 0.0f);
                        owner.getBatch().End();
                    }
                    else // Caso seja a invisibilidade
                    {
                        owner.getBatch().Begin();
                        Vector2 _direcao = owner.getDirecao();
                        owner.getBatch().Draw(imagem, owner.getPosition(), //antes estava apenas getPosition()
                            new Rectangle(0, 0, imagem.Width, imagem.Height), Color.White,
                            (float)Math.Atan2(_direcao.Y, _direcao.X),
                            new Vector2(imagem.Width / 2, imagem.Height / 2), //antes estava apenas new Vector2(imagem.Width, imagem.Height / 2)
                            1.0f, SpriteEffects.None, 0.0f);
                        owner.getBatch().End();
                    }
                }
                else
                {
                    Matrix rotation = Matrix.CreateRotationZ(angle);
                    Vector2 rotatedOffset = Vector2.Transform(offset, rotation);
                    Vector2 shieldPos = owner.getPosition() + rotatedOffset;
                    setPosition(shieldPos);
                    owner.getBatch().Begin();
                    owner.getBatch().Draw(getImagem(), shieldPos, null, Color.White, angle * 1.2f,
                        new Vector2(getImagem().Width / 2, getImagem().Height / 2), 0.5f, SpriteEffects.None, 0);
                    owner.getBatch().End();
                }
                
            }

        }

        public bool isEscudoAtivo()
        {
            return escudoAtivo;
        }

    }
}
